package main

import (
	"fmt"
)

//结构 struct
func main() {
	fmt.Println("examp16")
	//结构的声明
	u1 := user{} //声明一个结构,没赋值
	fmt.Println(u1)
	u2 := user{id: 1, name: "张三"} //赋值
	fmt.Println(u2)
	u3 := new(user) //使用new或使用&user{}声明一个结构,返回指针，一搬都这样做
	fmt.Println(u3)
	//结构方法
	u4 := &user{6, "李四"}
	u4.printName()   //调用方法
	u4.setName("王五") //修改生效
	u4.printName()
	u4.setName1("赵六") //修改未生效
	u4.printName()
	//嵌入结构
	h1 := home{user{3, "111"}, "北京"} //赋值
	h1 := home{user{3, "111"}, "北京"} //赋值
	fmt.Println(h1)
	h1.user.id = 4 //也可以这样
	fmt.Println(h1)
	h1.user = user{5, "2222"}
	fmt.Println(h1)

}

//结构可以嵌入结构，类似于java的继承，但不是继承
type home struct {
	user
	addr string
}

//结构类型定义
type user struct {
	id   int
	name string
}

//给user结构定义方法
func (u user) printName() {
	fmt.Println(u.name)
}

//使用指针定义方法,使用指针，可以修改当前声明结构里的值相当于引用修改
func (u *user) setName(name string) {
	u.name = name
}

//这样不是指针的修改定义的结构属性值是不生效的
func (u user) setName1(name string) {
	u.name = name
}
